#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 初始化树
    ui->treeWidget->setHeaderLabel("动物");
    // 添加顶层元素
    QTreeWidgetItem* item1 = new QTreeWidgetItem();
    // 注意每个元素都是可以设置多个列，此处为了简单就只设置一个列
    item1->setText(0, "狗");
    ui->treeWidget->addTopLevelItem(item1);

    QTreeWidgetItem* item2 = new QTreeWidgetItem();
    item2->setText(0, "猫");
    ui->treeWidget->addTopLevelItem(item2);

    QTreeWidgetItem* item3 = new QTreeWidgetItem();
    item3->setText(0, "鸟");
    ui->treeWidget->addTopLevelItem(item3);
    // 添加子元素
    QTreeWidgetItem* item4 = new QTreeWidgetItem();
    item4->setText(0, "中华田园猫");
    item2->addChild(item4);

    QTreeWidgetItem* item5 = new QTreeWidgetItem();
    item5->setText(0, "矮脚猫");
    item2->addChild(item5);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    // 添加顶层元素
    // 首先获取输入框中顶层元素的名称
    const QString& name = ui->lineEdit->text();
    // 定义一个元素
    QTreeWidgetItem* item = new QTreeWidgetItem();
    item->setText(0, name);
    // 设置进去
    ui->treeWidget->addTopLevelItem(item);
}

void Widget::on_pushButton_2_clicked()
{
    // 新增普通子元素
    // 首先获取输入框中子元素的名称
    const QString& name = ui->lineEdit->text();
    // 定义一个元素
    QTreeWidgetItem* item = new QTreeWidgetItem();
    item->setText(0, name);
    // 获取到鼠标选中的要添加子元素的父元素
    QTreeWidgetItem* parent = ui->treeWidget->currentItem();
    // 没有选中元素
    if(parent == nullptr) return;
    // 否则插入元素
    parent->addChild(item);
}

void Widget::on_pushButton_3_clicked()
{
    // 删除指定元素
    // 首先获取鼠标选中的元素
    QTreeWidgetItem* now = ui->treeWidget->currentItem();
    if(now == nullptr) return;  // 没有选中元素
    // 删除选中的元素，不能直接删除，需要先获取到它的父元素
    QTreeWidgetItem* parent = now->parent();
    // 如果没有父元素，说明是顶层元素，需要先获取到下标，再进行删除
    if(parent == nullptr)
    {
        int index = ui->treeWidget->indexOfTopLevelItem(now);
        ui->treeWidget->takeTopLevelItem(index);
    }
    // 有父元素，是普通元素，直接删除子元素
    else parent->removeChild(now);
}
